#include"log.h"
using namespace std;

int main()
{
  // cout<<Date::Now()<<endl;
  // string p="/home/sw/log_system_project/ready_test/log_project/b/abc.txt";
  string p = "../a/b.cc";
  // File::Createdir(File::Getpath(p));

  // cout<<Level::Tostring(Level::LevelType::DEBUG);

  // 三种基本日志落地模块测试：
  // Logmsg msg("root", "main.c ", 53, Level::LevelType::INFO, "格式化功能测试...");
  // Formatter fmt("abc%%abc[%d{%H:%M:%S}] %m%n");
  // Formatter::fptr  fmt(new Formatter);
  // string str = fmt->Format(msg);

  // Logsink::lptr stdout = Sinkfactory::Create<Stdoutsink>();
  // Logsink::lptr file = Sinkfactory::Create<Filesink>("./logfiles/test.log");
  // Logsink::lptr roll = Sinkfactory::Create<Rollfilesink>("./logfiles/rool-", 1024 * 1024);

  // stdout->log(str.c_str(), str.size());
  // file->log(str.c_str(), str.size());
  // size_t cur = 0;
  // while (cur < 1024 * 1024 * 10)
  // {
  //   roll->log(str.c_str(), str.size());
  //   cur += str.size();
  // }

  // 5s为总时长进行自定义滚动模块日志输出测试
  //  Logsink::lptr rt = Sinkfactory::Create<Rollbytimesink>("./log/rool-",Timegap::GAP_SECOND);
  //   time_t old=Date::Now();

  //    while(Date::Now()<old+5){
  //     rt->log(str.c_str(),str.size());
  //    }

  // 日志器模块简单测试:
  //    Formatter::fptr  fmt();
  //    Logsink::lptr stdout = Sinkfactory::Create<Stdoutsink>();
  //  Logsink::lptr file = Sinkfactory::Create<Filesink>("./l/test.log");
  //  Logsink::lptr roll = Sinkfactory::Create<Rollfilesink>("./l/rool-", 1024 * 1024);
  //  vector<Logsink::lptr> sinks={stdout,file,roll};
  //  //日志器的管理模块进行日志格式化与日志落地的管理
  //  Logger::lptr sl ("sync_logger",Level::LevelType::INFO,fmt,sinks);

  ////简单的建造者模式对同步日志器进行测试：

  //  Loggerbuilder::ptr bptr=make_shared<Localloggerbuilder>();
  //   bptr->Buildloggername("sync_logger");
  //   bptr->Buildloggertype(Loggertype::LOGGER_SYNC);
  //   bptr->Buildlimitlevel(Level::LevelType::INFO);
  //   bptr->Buildlogsinks<Stdoutsink>();
  //   bptr->Buildlogsinks<Filesink>("./l/test.log");
  //   bptr->Buildlogsinks<Rollfilesink>("./l/oll-",1024);

  //    Logger::lptr sl=bptr->Build();//检查下完整性并组装返回对应的模式的日志器

  // sl->Debug(__FILE__,__LINE__,"功能测试%s","---testing");
  // sl->Info(__FILE__,__LINE__,"功能测试%s","---testing");
  // sl->Warn(__FILE__,__LINE__,"功能测试%s","---testing");
  // sl->Error(__FILE__,__LINE__,"功能测试%s","---testing");
  // sl->Fatal(__FILE__,__LINE__,"功能测试%s","---testing");

  // 简单测试buff是否有问题：
  //  std::ifstream ifs;
  //  ifs.open("./l/test.log",std::ios::binary);
  //  ifs.seekg(0,std::ios::end);
  //  size_t size=ifs.tellg();
  //  ifs.seekg(0,std::ios::beg);
  //   Buffer bf;
  //   string s;
  //   s.resize(size);
  //   ifs.read(&s[0],size);
  //   ifs.close();
  //   for(int i=0;i<s.size();i++){
  //      bf.Push(&s[i],1);
  //   }
  //   //读出：
  //   std::ofstream ofs;
  //   ofs.open("./l/l.txt",std::ios::binary|std::ios::app);
  //  size_t r_size=bf.Rd_size();
  //   for(int i=0;i<r_size;i++){
  //     ofs.write(bf.R_begin(),1);
  //   bf.Pop(1);

  //   }
  //   ofs.close();

  ////简单的建造者模式对异步日志器进行测试：

  //  Loggerbuilder::ptr bptr=make_shared<Localloggerbuilder>();
  //   bptr->Buildloggername("Async_logger");
  //   bptr->Buildloggertype(Loggertype::LOGGER_ASYNC);
  //   bptr->Buildlimitlevel(Level::LevelType::INFO);
  //   bptr->Buildlogsinks<Stdoutsink>();
  //   bptr->Buildlogsinks<Filesink>("./l/test.log");
  //   bptr->Buildlogsinks<Rollfilesink>("./l/oll-",1024);
  //   bptr->Buildloopertype(AsyncIsSafe::ASYNC_UNSAFE);//这里测试还是建议不安全版本因为安全可能阻塞
  //   //bptr->Buildloopertype(AsyncIsSafe::ASYNC_UNSAFE);

  //    Logger::lptr sl=bptr->Build();//检查下完整性并组装返回对应的模式的日志器

  // // sl->Debug(__FILE__,__LINE__,"功能测试%s","---testing");
  // // sl->Info(__FILE__,__LINE__,"功能测试%s","---testing");
  // // sl->Warn(__FILE__,__LINE__,"功能测试%s","---testing");
  // // sl->Error(__FILE__,__LINE__,"功能测试%s","---testing");
  // // sl->Fatal(__FILE__,__LINE__,"功能测试%s","---testing");
  // size_t cnt=0;
  // while(cnt<1e5){
  //  sl->Warn(__FILE__,__LINE__,"功能测试%s-%d","---testing",cnt);
  //  cnt++;

  // }

  // 简单的建造者模式基于日志管理者统一管理下所有日志器模式下（loggermanager）测试：
  //解释：（通过Globalloggerbuilder进行logger的添加，然后再通过调用loggermanage进行日志器的使用模式）
  // 默认的root日志器：
  //   Loggermanager::Getinstance().Getroot()->Error(__FILE__,__LINE__,"功能测试%s","---testing");

  // 自己通过Globalloggerbuilder然后被manager管理再次使用：

  // Loggerbuilder::ptr gptr = make_shared<Globalloggerbuilder>();
  // gptr->Buildloggername("test");
  // gptr->Buildloggertype(Loggertype::LOGGER_ASYNC);
  // gptr->Buildloopertype(AsyncIsSafe::ASYNC_UNSAFE);
  // gptr->Build(); // 添加进loggermanager里

  // size_t cnt = 0;
  // while (cnt < 1e4)
  //   Loggermanager::Getinstance().Getlogger("test")->Debug(__FILE__, __LINE__, "功能测试%s-%d", "---testing", cnt++);


  //测试全局封装接口：
  //默认日志器
   DEBUG("nihao%d",3);
   Loggerbuilder::ptr gptr = make_shared<Globalloggerbuilder>();
   
   //自定义日志器：
   //创建日志器：
    gptr->Buildloggername("test");
   gptr->Buildloggertype(Loggertype::LOGGER_ASYNC);
   gptr->Buildloopertype(AsyncIsSafe::ASYNC_UNSAFE);
   gptr->Build(); // 添加进loggermanager里
  //manager使用：
   GetLogger("test")->Debug("nihao%d",3);


}
